\begin{tikzpicture}

	\labeledcompoundnode{fbdrv}{component, minimum width=17ex}{Framebuffer driver}{

		\node[capability] (fbdrvcapturesessioncap) {};
	}

	\labeledcompoundnode{inputdrv}{component, minimum width=17ex, below=5ex of fbdrv}{Input driver}{

		\node[capability] (inputdrveventsessioncap) {};
	}

	\node[fit=(fbdrv) (inputdrv)] (drivers) {};

	\labeledcompoundnode{gui}{component, right=5ex of drivers}{GUI server}{

		\rpcobjectrnode{guisession1}{align=center}{}{GUI session}
		\rpcobjectrnode{guisession2}{align=center, below=1ex of guisession1}{}{GUI session}
		\rpcobjectrnode{guisession3}{align=center, below=1ex of guisession2}{}{GUI session}
		\rpcobjectlnode{capturesession}{align=center, xshift=-25ex, yshift=-2ex}{}{Capture session}
		\rpcobjectlnode{eventsession}{align=center,   xshift=-25ex, yshift=-7ex}{}{Event session}
	}

	\labeledcompoundnode{app1}{component, right=6ex of gui, yshift=10ex,
	                          minimum width=12ex}{Application}{
		\node[capability] (app1guisessioncap) {};
	}

	\labeledcompoundnode{app2}{component, below=3ex of app1,
	                          minimum width=12ex}{Application}{
		\node[capability] (app2guisessioncap) {};
	}

	\labeledcompoundnode{app3}{component, below=3ex of app2,
	                          minimum width=12ex}{Application}{
		\node[capability] (app3guisessioncap) {};
	}

	% capability associations
	\path [draw, dashed] (capturesessioncap) -- (fbdrvcapturesessioncap);
	\path [draw, dashed] (eventsessioncap)   -- (inputdrveventsessioncap);
	\path [draw, dashed] (guisession1cap)    -- (app1guisessioncap);
	\path [draw, dashed] (guisession2cap)    -- (app2guisessioncap);
	\path [draw, dashed] (guisession3cap)    -- (app3guisessioncap);

\end{tikzpicture}
